// eslint.config.js - ESLint 9.0+ 配置文件
import { defineConfig, globalIgnores } from 'eslint/config'
import js from '@eslint/js' // 提供基础JavaScript规则
import tsPlugin from '@typescript-eslint/eslint-plugin' // TypeScript插件
import tsParser from '@typescript-eslint/parser' // TypeScript解析器
import vuePlugin from 'eslint-plugin-vue' // Vue插件
import vueParser from 'vue-eslint-parser' // Vue解析器
import importPlugin from 'eslint-plugin-import' // import插件
import reactPlugin from 'eslint-plugin-react' // React插件
import reactHooksPlugin from 'eslint-plugin-react-hooks' // React Hooks插件
import prettierPlugin from 'eslint-plugin-prettier' // Prettier插件
import prettierConfig from 'eslint-config-prettier' // Prettier配置
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import globals from 'globals' // 全局变量
import fs from 'fs'

// 设置当前目录
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

// 解析自动导入配置
const autoImportConfig = JSON.parse(fs.readFileSync('.eslintrc-auto-import.json', 'utf-8'))

export default defineConfig([
  // 全局忽略的文件和目录
  globalIgnores([
    '**/node_modules/**',
    '**/dist/**',
    '**/build/**',
    '**/.git/**',
    '**/.vscode/**',
    '**/.idea/**',
    '**/coverage/**',
    '**/public/**',
    '**/temp/**',
    '**/*.min.js',
    '**/vendor/**',
    '**/.DS_Store',
    '**/package-lock.json',
    '**/yarn.lock',
    '**/pnpm-lock.yaml',
  ]),

  // 全局配置
  {
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node,
        ...autoImportConfig.globals,
        ...{
          PageQuery: 'readonly',
          PageResult: 'readonly',
          OptionType: 'readonly',
          ResponseData: 'readonly',
          ExcelResult: 'readonly',
          TagView: 'readonly',
          AppSettings: 'readonly',
          __APP_INFO__: 'readonly',
        },
      },
    },
    plugins: { prettier: prettierPlugin },
    rules: {
      ...prettierConfig.rules, // 关闭与 Prettier 冲突的规则
      ...prettierPlugin.configs.recommended.rules, // 启用 Prettier 规则
      'prettier/prettier': 'error', // 强制 Prettier 格式化
      'no-unused-vars': [
        'error',
        {
          argsIgnorePattern: '^_', // 忽略参数名以 _ 开头的参数未使用警告
          varsIgnorePattern: '^[A-Z0-9_]+$', // 忽略变量名为大写字母、数字或下划线组合的未使用警告（枚举定义未使用场景）
          ignoreRestSiblings: true, // 忽略解构赋值中同级未使用变量的警告
        },
      ],
    },
  },

  // 基础JavaScript配置
  {
    // 应用于所有JS文件
    files: ['**/*.{js,mjs,cjs,jsx}'],
    // 继承JavaScript推荐配置
    ...js.configs.recommended,
    // 额外规则
    rules: {
      // 强制使用严格模式
      'strict': ['error', 'global'],
      // 禁止使用var
      'no-var': 'error',
      // 优先使用const
      'prefer-const': 'error',
      // 强制使用分号
      'semi': ['error', 'always'],
      // 强制使用单引号
      'quotes': ['error', 'single', { 'avoidEscape': true }],
      // 缩进设置
      'indent': ['error', 2, { 'SwitchCase': 1 }],
      // 允许console语句(可根据环境调整)
      'no-console': 'off',
      // 调试语句
      'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'warn',
      // 尾随逗号
      'comma-dangle': ['error', 'only-multiline'],
      // 函数圆括号前的空格
      'space-before-function-paren': ['error', {
        'anonymous': 'always',
        'named': 'never',
        'asyncArrow': 'always',
      }],
      // 最大空行
      'no-multiple-empty-lines': ['error', { 'max': 2, 'maxEOF': 1 }],
    },
    // 语言选项
    languageOptions: {
      ecmaVersion: 2024,
      sourceType: 'module',
      globals: {
        ...globals.browser, // 浏览器环境
        ...globals.node,    // Node.js环境
        ...globals.es2024,  // ES2021特性
      },
    },
  },

  // TypeScript配置
  {
    // 应用于所有TS文件
    files: ['**/*.{ts,tsx,mts,cts}'],
    // 继承TypeScript推荐规则
    plugins: {
      '@typescript-eslint': tsPlugin,
    },
    languageOptions: {
      parser: tsParser,
      parserOptions: {
        ecmaVersion: 2024,
        sourceType: 'module',
        project: './tsconfig.json', // TS项目配置文件
        ecmaFeatures: {
          jsx: true, // 支持JSX
        },
      },
      globals: {
        ...globals.browser,
        ...globals.node,
        ...globals.es2024,
      },
    },
    // TypeScript特定规则
    rules: {
      // 继承基础规则
      ...tsPlugin.configs.recommended.rules,
      // 允许使用any (可根据需要调整)
      '@typescript-eslint/no-explicit-any': 'warn',
      // 类型导入风格
      '@typescript-eslint/consistent-type-imports': 'error',
      // 期望错误处理
      '@typescript-eslint/prefer-ts-expect-error': 'error',
      // 非空断言
      '@typescript-eslint/no-non-null-assertion': 'warn',
      // 未使用变量
      '@typescript-eslint/no-unused-vars': ['warn', {
        'argsIgnorePattern': '^_',
        'varsIgnorePattern': '^_',
      }],
      // 显式函数返回类型
      '@typescript-eslint/explicit-function-return-type': ['warn', {
        'allowExpressions': true,
        'allowHigherOrderFunctions': true,
      }],
      // 接口和类型别名命名前缀
      '@typescript-eslint/naming-convention': [
        'error',
        {
          'selector': 'interface',
          'format': ['PascalCase'],
          'prefix': ['I'],
        },
        {
          'selector': 'typeAlias',
          'format': ['PascalCase'],
          'prefix': ['T'],
        },
      ],
    },
  },

  // Vue配置
  {
    // 应用于所有Vue文件
    files: ['**/*.vue'],
    // Vue插件
    plugins: {
      'vue': vuePlugin,
    },
    // 配置解析器
    languageOptions: {
      parser: vueParser, // Vue解析器
      parserOptions: {
        parser: tsParser, // 内联TypeScript解析器
        ecmaVersion: 2024,
        sourceType: 'module',
        ecmaFeatures: {
          jsx: true,
        },
        extraFileExtensions: ['.vue'], // 支持Vue文件
      },
      globals: {
        ...globals.browser,
        ...globals.node,
        ...globals.es2024,
      },
    },
    // Vue特定规则
    rules: {
      // 组件名格式
      'vue/multi-word-component-names': 'off', // 关闭多词组件名要求
      // Props修改
      'vue/no-mutating-props': 'error',
      // 属性格式
      'vue/attribute-hyphenation': ['error', 'always'],
      // Prop验证
      'vue/require-prop-types': 'error',
      // v-on风格
      'vue/v-on-style': ['error', 'shorthand'],
      // 组件顺序
      'vue/order-in-components': 'error',
      // 防止自关闭组件
      'vue/html-self-closing': ['error', {
        'html': {
          'void': 'always',
          'normal': 'never',
          'component': 'always',
        },
      }],
    },
  },

  // React配置
  {
    // 应用于所有JSX/TSX文件
    files: ['**/*.{jsx,tsx}'],
    // React插件
    plugins: {
      'react': reactPlugin,
      'react-hooks': reactHooksPlugin,
    },
    // 设置
    settings: {
      react: {
        version: 'detect', // 自动检测React版本
      },
    },
    // React特定规则
    rules: {
      // 继承React推荐规则
      ...reactPlugin.configs.recommended.rules,
      // 继承React Hooks规则
      ...reactHooksPlugin.configs.recommended.rules,
      // JSX元素闭合风格
      'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
      // Props排序
      'react/jsx-sort-props': ['error', {
        'callbacksLast': true,
        'shorthandFirst': true,
        'ignoreCase': true,
        'reservedFirst': true,
      }],
      // 必须的Props验证
      'react/prop-types': 'error',
      // 默认Props
      'react/require-default-props': 'error',
      // 更喜欢函数组件
      'react/prefer-stateless-function': 'error',
    },
  },

  // 导入/导出规则
  {
    // 适用于所有JS/TS文件
    files: ['**/*.{js,mjs,cjs,jsx,ts,tsx,mts,cts}'],
    // 导入插件
    plugins: {
      'import': importPlugin,
    },
    // 导入规则
    rules: {
      // 导入顺序
      'import/order': ['error', {
        'groups': [
          'builtin',      // 内置模块
          'external',     // 外部模块
          'internal',     // 内部模块
          ['parent', 'sibling'], // 父模块和兄弟模块
          'index',        // 索引文件
          'object',       // 对象导入
          'type',          // 类型导入
        ],
        'pathGroups': [
          {
            'pattern': 'react',
            'group': 'builtin',
            'position': 'before',
          },
        ],
        'newlines-between': 'always',
        'alphabetize': {
          'order': 'asc',
          'caseInsensitive': true,
        },
      }],
      // 禁止未使用的模块
      'import/no-unused-modules': ['error', {
        'unusedExports': true,
      }],
      // 禁止循环依赖
      'import/no-cycle': 'error',
    },
  },

  // Prettier集成
  {
    // 适用于所有文件
    files: ['**/*'],
    plugins: {
      prettier: prettierPlugin,
    },
    rules: {
      'prettier/prettier': ['error', {
        'singleQuote': true,
        'semi': true,
        'tabWidth': 2,
        'printWidth': 100,
        'trailingComma': 'es5',
        'arrowParens': 'avoid',
      }],
      ...prettierConfig.rules,
    },
  },

  // 测试文件配置
  {
    // 适用于测试文件
    files: [
      '**/*.test.{js,mjs,cjs,jsx,ts,tsx}',
      '**/*.spec.{js,mjs,cjs,jsx,ts,tsx}',
      '**/__tests__/**/*.{js,mjs,cjs,jsx,ts,tsx}',
    ],
    // 测试环境特定设置
    languageOptions: {
      globals: {
        ...globals.jest, // Jest环境
        describe: true,
        it: true,
        expect: true,
        beforeEach: true,
        afterEach: true,
        beforeAll: true,
        afterAll: true,
      },
    },
    // 测试文件特定规则
    rules: {
      // 允许在测试文件中使用dev-dependencies
      'import/no-extraneous-dependencies': ['error', { 'devDependencies': true }],
      // 放宽对测试文件的某些限制
      'max-lines': 'off',
      'max-nested-callbacks': 'off',
    },
  },
])
